iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0
自我挑戰組

新手挑戰 picoCTF:資安入門紀錄系列 第 23

Big Zip — 解密大型壓縮檔

  • 分享至 

  • xImage
  •  

今天挑戰:
https://ithelp.ithome.com.tw/upload/images/20251006/20178898xM5nZuAxJ5.png
這題給了一個很大的 ZIP 檔,flag 就藏在壓縮內容中的某個文字檔裡。
重點不是一次全部解壓(檔案太大),而是先用「列清單 + 不解壓直接檢視」的方式快速搜尋,再對可疑檔案或巢狀壓縮逐層處理,最後用 grep 抓到結果。


解題步驟與思路
一、下載檔案並檢查大小:
wget -O big-zip-files.zip "https://artifacts.picoctf.net/c/504/big-zip-files.zip"
ls -lh big-zip-files.zip
確認檔案有下載完整、大小合理(避免中途斷線或損毀)。


二、先列出 ZIP 內檔案清單(不解壓):
unzip -l big-zip-files.zip | sed -n '1,40p'
這樣可以先了解結構(是否有大量巢狀 .zip/.tar、或很多 .txt/.md 檔),避免盲目全部展開造成磁碟壓力。


三、在壓縮檔內逐檔檢索 picoCTF:

for f in $(zipinfo -1 big-zip-files.zip); do
  unzip -p big-zip-files.zip "$f" 2>/dev/null | grep -a -n "picoCTF{" && echo "FOUND IN: $f" && break
done

unzip -p 可以把壓縮裡單一檔案輸出到 stdout,搭配 grep -a(把二進位也當文字搜索)能在不解壓到硬碟的情況下直接檢查內容。執行上步驟是無法找到答案ㄉ。


四、解到工作資料夾,逐層解壓並搜尋:

shopt -s globstar nullglob
while true; do
  found=0
  for z in **/*.zip; do
    [ -f "$z" ] || continue
    d="${z%.*}"
    mkdir -p "$d"
    unzip -oq "$z" -d "$d" && echo "unzipped $z -> $d"
    rm -f "$z"
    found=1
  done
  for t in **/*.tar.gz **/*.tgz **/*.tar.bz2 **/*.tar.xz **/*.tar; do
    [ -f "$t" ] || continue
    d="${t%.*}"
    mkdir -p "$d"
    tar -xf "$t" -C "$d" && echo "untarred $t -> $d"
    rm -f "$t"
    found=1
  done
  [ "$found" -eq 1 ] || break
done
grep -R -n --binary-files=text "picoCTF{" . | sed -n '1,100p'

系統會跑出一大堆亂碼,然後在最後面就會看到本題的Flag了!!
https://ithelp.ithome.com.tw/upload/images/20251006/20178898WeneLblFej.png


小小心得
面對大壓縮檔,先「看」再「動手」:可以使用unzip -l / zipinfo 快速了解內容。
用 unzip -p + grep 可以快速在壓縮內搜尋,不必把檔案寫到硬碟。
遇到巢狀壓縮,採「逐層拆解」的策略,必要時用腳本自動化但要小心空間。
若 flag 看起來是亂碼或藏在二進位,試 strings、base64 -d、或 exiftool 等工具檢查內嵌資料。

這題練到的不是複雜演算法,而是檔案處理與命令列思維,如何在龐大資料裡有效率地搜尋、如何利用工具管線(pipeline)減少 I/O 與儲存成本,和如何安全地遞迴處理巢狀檔案。


上一篇
Enhance!(SVG)— 從隱藏的 SVG 拿到 flag
系列文
新手挑戰 picoCTF:資安入門紀錄23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言